#include <iostream>
using namespace std;
#include<vector>


int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    vector<vector<int>>dp(n + 1, vector<int>(m + 1, 0));
    vector<vector<int>>arr(n + 1, vector<int>(m + 1, 0));
    for (int i = 0; i < n; ++i)
    {
        string s;
        int cur = 0;
        cin >> s;
        while (cur < s.size())
        {
            if (s[cur] == 'l')
            {
                arr[i + 1][cur + 1] = 4;
            }
            else if (s[cur] == 'o')
            {
                arr[i + 1][cur + 1] = 3;
            }
            else if (s[cur] == 'v')
            {
                arr[i + 1][cur + 1] = 2;
            }
            else if (s[cur] == 'e')
            {
                arr[i + 1][cur + 1] = 1;
            }
            else
            {
                arr[i + 1][cur + 1] = 0;
            }
            cur++;
        }
    }

    dp[1][1] = arr[1][1];
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            dp[i][j] += arr[i][j];
        }
    }
    printf("%d", dp[n][m]);
}

//int Max = 0;
//void Score_max(vector<string>& grid, int row, int col, int k)
//{
//    if (row < 0 || col < 0 || row >= grid.size() || col >= grid[0].size())
//    {
//        if (k > Max)
//        {
//            Max = k;
//        }
//        return;
//    }
//    int t;
//    if (grid[row][col] == 'l')
//    {
//        k += 4;
//        t = 4;
//    }
//    else if (grid[row][col] == 'o')
//    {
//        k += 3;
//        t = 3;
//    }
//    else if (grid[row][col] == 'v')
//    {
//        k += 2;
//        t = 2;
//    }
//    else if (grid[row][col] == 'e')
//    {
//        k += 1;
//        t = 1;
//    }
//    else
//    {
//        t = 0;
//    }
//
//    Score_max(grid, row + 1, col, k);
//    Score_max(grid, row, col + 1, k);
//    k -= t;
//}
//
//int main() {
//    int n, m;
//    scanf("%d %d", &n, &m);
//    vector<string>grid;
//    for (int i = 0; i < n; ++i)
//    {
//        string s;
//        cin >> s;
//        grid.push_back(s);
//    }
//    Score_max(grid, 0, 0, 0);
//    printf("%d", Max);
//}
//typedef long long ll;
//class Solution
//{
//public:
//    int MLS(vector<int>& arr)
//    {
//        set<ll>s(arr.begin(), arr.end());
//        vector<ll>arr2(s.begin(), s.end());
//        int cur = 0, Max = 0;
//
//        while (cur < arr2.size())
//        {
//            ll ret = arr2[cur];
//            int num = 0;
//            while (cur < arr2.size() && arr2[cur] == ret)
//            {
//                cur++;
//                num++;
//                ret++;
//            }
//
//            if (num > Max)
//            {
//                Max = num;
//            }
//        }
//        return Max;
//    }
//};

//int main()
//{
//    ll a, b;
//    cin >> a >> b;
//    ll num, a1 = a, b1 = b;
//    while (1)
//    {
//        ll i = b1 % a1;
//        if (i == 0)
//        {
//            num = a1;
//            break;
//        }
//        b1 = a1;
//        a1 = i;
//    }
//    cout << a * (b / num);
//}